0173. 二叉搜索树迭代器【中等】
1. 📝 题目描述
实现一个二叉搜索树迭代器类BSTIterator,表示一个按中序遍历二叉搜索树(BST)的迭代器:
BSTIterator(TreeNode root)初始化BSTIterator类的一个对象。BST 的根节点root会作为构造函数的一部分给出。指针应初始化为一个不存在于 BST 中的数字,且该数字小于 BST 中的任何元素。boolean hasNext()如果向指针右侧遍历存在数字,则返回true;否则返回false。int next()将指针向右移动,然后返回指针处的数字。
注意,指针初始化为一个不存在于 BST 中的数字,所以对 next() 的首次调用将返回 BST 中的最小元素。
你可以假设 next() 调用总是有效的,也就是说,当调用 next() 时,BST 的中序遍历中至少存在一个下一个数字。
示例:

txt
输入
["BSTIterator", "next", "next", "hasNext", "next", "hasNext", "next", "hasNext", "next", "hasNext"]
[[[7, 3, 15, null, null, 9, 20]], [], [], [], [], [], [], [], [], []]
输出
[null, 3, 7, true, 9, true, 15, true, 20, false]
解释
BSTIterator bSTIterator = new BSTIterator([7, 3, 15, null, null, 9, 20]);
bSTIterator.next(); // 返回 3
bSTIterator.next(); // 返回 7
bSTIterator.hasNext(); // 返回 True
bSTIterator.next(); // 返回 9
bSTIterator.hasNext(); // 返回 True
bSTIterator.next(); // 返回 15
bSTIterator.hasNext(); // 返回 True
bSTIterator.next(); // 返回 20
bSTIterator.hasNext(); // 返回 False1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
提示:
- 树中节点的数目在范围
[1, 10^5]内 0 <= Node.val <= 10^6- 最多调用
10^5次hasNext和next操作
进阶:
- 你可以设计一个满足下述条件的解决方案吗?
next()和hasNext()操作均摊时间复杂度为O(1),并使用O(h)内存。其中h是树的高度。
2. 🎯 s.1 - 栈模拟中序遍历
c
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
typedef struct {
struct TreeNode** stack;
int top;
} BSTIterator;
void pushLeft(BSTIterator* obj, struct TreeNode* node) {
while (node) {
obj->stack[++obj->top] = node;
node = node->left;
}
}
BSTIterator* bSTIteratorCreate(struct TreeNode* root) {
BSTIterator* obj = (BSTIterator*)malloc(sizeof(BSTIterator));
obj->stack = (struct TreeNode**)malloc(sizeof(struct TreeNode*) * 100001);
obj->top = -1;
pushLeft(obj, root);
return obj;
}
int bSTIteratorNext(BSTIterator* obj) {
struct TreeNode* node = obj->stack[obj->top--];
pushLeft(obj, node->right);
return node->val;
}
bool bSTIteratorHasNext(BSTIterator* obj) {
return obj->top >= 0;
}
void bSTIteratorFree(BSTIterator* obj) {
free(obj->stack);
free(obj);
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
js
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
*/
var BSTIterator = function (root) {
this.stack = []
this._pushLeft(root)
}
BSTIterator.prototype._pushLeft = function (node) {
while (node) {
this.stack.push(node)
node = node.left
}
}
/**
* @return {number}
*/
BSTIterator.prototype.next = function () {
const node = this.stack.pop()
this._pushLeft(node.right)
return node.val
}
/**
* @return {boolean}
*/
BSTIterator.prototype.hasNext = function () {
return this.stack.length > 0
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
py
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class BSTIterator:
def __init__(self, root: Optional[TreeNode]):
self.stack = []
self._push_left(root)
def _push_left(self, node):
while node:
self.stack.append(node)
node = node.left
def next(self) -> int:
node = self.stack.pop()
self._push_left(node.right)
return node.val
def hasNext(self) -> bool:
return len(self.stack) > 01
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
- 时间复杂度:
next()和hasNext()均摊 - 空间复杂度:
,其中 是树的高度
算法思路:
- 用栈保存从当前节点到最左叶子的路径
next()时弹出栈顶节点,然后将其右子树的所有左孩子压栈- 每个节点恰好被压栈和弹栈各一次,因此摊还复杂度为